package com.jvm.interrupt;

import java.util.concurrent.TimeUnit;

// 线程阻塞状态中如何中断

/**
 *
 * 1 调用线程的 interrupt()实例方法，线程的中断标志会被置为 true
    2 当线程处于阻塞状态时，调用线程的 interrupt()实例方法，
 线程内部会触发 InterruptedException 异常，
 并且会清除线程内部的中断标志（即将中断标志置为 false）
 *
 */
public class Demo3 {

//    public static class T extends Thread {
//        @Override
//        public void run() {
//            while (true) {
//                // 循环处理业务
//                // 下面模拟阻塞代码
//                try {
//                    TimeUnit.SECONDS.sleep(1000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }
//
//    public static void main(String[] args) {
//        T t = new T();
//        t.start();
//        // 运行上面代码，发现程序无法结束
//    }


        public static class T extends Thread {
        @Override
        public void run() {
            while (true) {
                // 循环处理业务
                // 下面模拟阻塞代码
                try {
                    TimeUnit.SECONDS.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    this.interrupt();
                }

                if (this.isInterrupted()) {
                    break;
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        T t = new T();
        t.start();
        TimeUnit.SECONDS.sleep(3);
        t.interrupt();
        // 程序可以正常结束
        /**
         * 注意：
         *
1 main 方法中调用了 t.interrupt()方法，此时线程 t 内部的中断标志会置为 true
2 然后会触发 run()方法内部的 InterruptedException 异常，所以运行结果中有异常输出，上面说了，当触发 InterruptedException 异常时候，线程内部的中断标志又会被清除（变为 false），所以在 catch 中又调用了 this.interrupt();一次，将中断标志置为 false
3 run()方法中通过 this.isInterrupted()来获取线程的中断标志，退出循环（break）
         *
         */
    }


}
